package Thread;
import java.util.concurrent.atomic.AtomicInteger;
/**AtomicInteger*/

/*AtomicInteger 是 Java 并发包 (java.util.concurrent.atomic) 中的一个类，
它提供了一种线程安全的方式来操作整数。AtomicInteger 的方法（如 incrementAndGet()）
是通过硬件级别的原子操作来实现线程安全的，而不需要显式地使用 synchronized 关键字或锁对象。*/

/*AtomicInteger 的原理
AtomicInteger 利用现代处理器提供的 CAS（Compare-And-Swap）指令来实现原子操作。CAS 指令的基本思想是：

比较：比较内存中的值与预期值是否相等。
交换：如果相等，则将内存中的值更新为新值；如果不相等，则不做任何操作。
这个过程是原子性的，即不可中断的，确保了在多线程环境下操作的线程安全性。*/

/*incrementAndGet() 方法的实现大致如下：

public final int incrementAndGet() {
    return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}
其中，unsafe.getAndAddInt 是一个底层的原子操作，利用了 CAS 指令。具体来说：
获取当前值：从内存中读取 AtomicInteger 的当前值。计算新值：将当前值加1。
CAS 操作：尝试将内存中的值从旧值更新为新值。如果内存中的值在读取后没有被其他线程修改过，更新成功；否则，重试直到更新成功。*/
public class demo15_2 {
    private static AtomicInteger count = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count.incrementAndGet();
            }
            System.out.println("t1结束");
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count.incrementAndGet();
            }
            System.out.println("t2结束");
        });

        t1.start();
        t2.start();

        t1.join();
        t2.join();

        System.out.println(count.get());
    }
}

/*初始化：创建一个 AtomicInteger 对象 count，初始值为0。
创建线程：
1.t1 线程：循环50,000次，每次调用 count.incrementAndGet() 增加 count 的值。
2.t2 线程：同样循环50,000次，每次调用 count.incrementAndGet() 增加 count 的值。
3.启动线程：启动 t1 和 t2 线程。
4.等待线程结束：使用 t1.join() 和 t2.join() 确保主线程等待 t1 和 t2 线程执行完毕。
5.输出结果：打印 count 的最终值。*/

//AtomicInteger 通过硬件级别的 CAS 指令实现了线程安全的操作
//无需显式的锁机制。这种方式不仅简化了代码，还提高了性能，因为 CAS 操作通常比传统的锁机制更高效。